package cn.itcast.solrTest;

import cn.itcast.pojo.SolrPojo;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.junit.Test;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * solr入门案例
 */
public class SolrTest01 {
    //入门案例,写入索引
    @Test
    public void createIndexToSolr() throws IOException, SolrServerException {
        //1 创建solrj对象
        SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/collection1");

        //2 添加document对象,这里是solr的对象
//        SolrDocument document = new SolrDocument();
        //SolrDocument与实体类转换操作
        SolrInputDocument document = new SolrInputDocument();
        //添加内容
        document.addField("id",1);
        document.addField("title","简介");
        document.addField("content","学习大数据知识");

        //索引添加
        solrServer.add(document);

        //提交索引
        solrServer.commit();
    }

    //写入多条索引
    //注意:id如果相同,那么重复写入的操作实现的是替换!!
    @Test
    public void createMoreIndexToSolr() throws Exception {
        // 创建SolrServer对象
        SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/collection1");

        //设置多条索引
        List<SolrInputDocument> list = new ArrayList<SolrInputDocument>();
        for (int i = 0; i < 10; i++) {
            //创建一个document
            SolrInputDocument document = new SolrInputDocument();
            document.addField("id",i);
            document.addField("title","多个solr索引简介");
            document.addField("content","solr是一个独立的企业级搜索应用服务器, 可以通过http请求访问这个服务器, 获取或者写入对应的内容, 其底层是Lucene "+i);

            //把这些添加到集合中去
            list.add(document);
        }
        //写入索引
        solrServer.add(list);
        //提交索引
        solrServer.commit();
    }

    @Test
    public void createIndexJavaBeanToSolr() throws IOException, SolrServerException {
        // 创建SolrServer对象
        SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/collection1");

        //创建product对象,写入索引
        SolrPojo pojo = new SolrPojo();

        pojo.setId("10");
        pojo.setName("苹果笔记本电脑");
        pojo.setTitle(new String[]{"贵,不是我的错,是你的错"});
        pojo.setBrand("苹果");
        pojo.setPrice("13998");

        //写入索引
        solrServer.addBean(pojo);
        //提交索引
        solrServer.commit();

    }

    //删除索引
    @Test
    public void delSolr() throws IOException, SolrServerException {
        //1 创建solrServer对象
        SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/collection1");
        //2 执行删除(通过id或者通过字段名:字段值)
        solrServer.deleteById("10");//通过id删除索引
//        solrServer.deleteByQuery("content:*");
//        *表示全部,如果想要删除所有,那么可以写*:*,不建议这样做
        //3 提交索引
        solrServer.commit();
    }

    /*
        查询索引
     */
    @Test
    public void baseQueryToSolr() throws SolrServerException {
        // 创建solrServer对象
        SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/collection1");

        //执行查询全部
        SolrQuery solrQuery = new SolrQuery("*:*");
        //利用对象来调用查询方法,查询条件是SolrQuery对象所设置的条件
        QueryResponse queryResponse = solrServer.query(solrQuery);

        //解析查询返回值
        SolrDocumentList results = queryResponse.getResults();//获取结果集
        //遍历结果集
        for (SolrDocument document : results) {
            Object id = document.get("id");
            Object title = document.get("title");
            Object content = document.get("content");
            System.out.println(id+" "+title+" "+content);

        }

    }

    /*
        查询后返回javaBean
     */
    @Test
    public void beanQuerySolr() throws SolrServerException {
        //获取对象
        SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/collection1");

        //执行查询
        SolrQuery solrQuery = new SolrQuery("*:*");//查询条件

        QueryResponse queryResponse = solrServer.query(solrQuery);//查询的返回值

//        SolrDocumentList results = queryResponse.getResults();//这里不需要哦获取结果集

        //解析返回的结果集
        List<SolrPojo> list = queryResponse.getBeans(SolrPojo.class);//直接用返回值获取实体,封装到list
        /**
         * 这里需要注意一下,各个字段的属性,类型
         */
        //循环集合输出结果
        for (SolrPojo pojo : list) {

            System.out.println(pojo);
        }

    }

   /*
    复杂查询
    1 先做一个基础查询公共方法
    */
   public void basicQuery(SolrQuery solrQuery) throws SolrServerException {
       //创建对象
       SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/collection1");

       //查询所有
       SolrQuery solrQuery1 = new SolrQuery("*:*");

       QueryResponse queryResponse = solrServer.query(solrQuery1);

       //解析
//       SolrDocumentList documents = queryResponse.getResults();
       List<SolrPojo> list = queryResponse.getBeans(SolrPojo.class);
       for (SolrPojo document : list) {
           System.out.println(document);
       }


   }

   //通配符查询  * ? *表示0个或者多个 ?表示一个字符
   @Test
    public void wildCardQuery() throws SolrServerException {
       //给一个查询条件
       SolrQuery solrQuery = new SolrQuery("content:lunce*");
       solrQuery.setRows(20);//显示多少条数据
       basicQuery(solrQuery);

   }

   //布尔查询
    @Test
    public void booleanQuery() throws SolrServerException {
        /**
         * 1.布尔查询:
         *      AND  OR NOT:
         *          AND : MUST
         *          OR: SHOULD
         *          NOT : MUST_NOT
         */
        SolrQuery solrQuery = new SolrQuery("content:lucene NOT name:iPhone");
        basicQuery(solrQuery);
    }




















}
